home *** CD-ROM | disk | FTP | other *** search
/ PC World Interactive 7 / PC World Interactive 7.iso / program / pasprog.EXE / ARJV.PAS < prev    next >
Pascal/Delphi Source File  |  1996-06-23  |  7KB  |  215 lines

  1. { ArjV.Pas : Unit to view contents of .ARJ files.  By Steve Wierenga. Released
  2.   to the Public Domain.                                                       }
  3. Unit ArjV;
  4. (**) INTERFACE (**)
  5. Uses Dos,Crt;
  6. Type
  7.   AFHeader = Record  { ArjFileHeader }
  8.     HeadID,HdrSize : Word;
  9.     HeadSize,VerNum,MinVerNum,HostOS,ArjFlag,Method,Ftype,Reserved : Byte;
  10.     FileTime,PackSize,OrigSize,FileCRC : LongInt;
  11.     FilePosF,FileAcc,HostData : Word;
  12.   End;
  13. Var
  14.   ff     : Integer;
  15.   b      : Byte;
  16.   f      : file;
  17.   sl     : LongInt;
  18.   NR     : Word;
  19.   FHdr   : ^AFHeader;
  20.   s,sss  : String;
  21.   Method : String[8];
  22.   l      : String[80];
  23.   Z,
  24.   totalu,
  25.   totalc : LongInt;
  26.   x,d    : LongInt;
  27.   Dt1,dt2: DateTime;
  28.   i,e    : integer;
  29.   registered : boolean;
  30. Procedure ArjView(ArjFile : String);
  31. Function GAN(ArjFile : String): String;
  32.  
  33. (**) IMPLEMENTATION (**)
  34. Procedure Terminate;
  35. Begin
  36.   Write('ARCHPEEK could not find specified file.  Aborting...');
  37.   Halt;
  38. End;
  39.  
  40. Procedure ArjView(ArjFile : String);
  41. Begin
  42.   New(FHdr);
  43.   Assign(f, arjfile);
  44.   {$I-}
  45.   Reset(F, 1);                     { Open File }
  46.   {$I+}
  47.   If IOResult <> 0 then Terminate; { Specified file exists? }
  48.   registered := false;             { Unregistered }
  49.   if not registered then
  50.   begin
  51.     Writeln('ArchPeek 0.01Alpha [UNREGISTERED] Copyright 1993 Steve Wierenga');
  52.     Delay(200);
  53.   end;
  54.   SL := 0;z := 0;TotalU := 0; TotalC := 0;   { Init variables }
  55.   sss := GAN(ArjFile);                       { Get the Arj filename }
  56.   Writeln( 'Arj FileName: ',SSS);
  57.   Write( '   Name           Length      Size       Saved     Method     Date     Time      ');
  58.   WriteLn( '  ____________________________________________________________________________');
  59.   ff := 0;
  60.   Repeat
  61.     ff := ff + 1;
  62.     Seek(F,SL);
  63.     BlockRead(F,FHdr^,SizeOf(AFHeader),NR);     { Read the header }
  64.     If (NR = SizeOf(AFHeader)) Then
  65.       Begin
  66.         s := '';
  67.         Repeat
  68.           BlockRead(F,B,1);               { Get Char for Compressed Filename }
  69.           If B <> 0 Then s := s + Chr(b); { Put char in string }
  70.         Until B = 0;                      { Until no more chars }
  71.         Case Length(S) Of                 { Straighten out string }
  72.        0  : s := s + '            ';
  73.        1  : S := s + '           ';
  74.        2  : s := s + '          ';
  75.        3  : S := S + '         ';
  76.        4  : S := S + '        ';
  77.        5  : S := S + '       ';
  78.        6  : S := S + '      ';
  79.        7  : S := S + '     ';
  80.        8  : S := S + '    ';
  81.        9  : S := S + '   ';
  82.        10 : S := S + '  ';
  83.        11 : S := S + ' ';
  84.        12 : S := S;
  85.       End;
  86.         z := z + 1;
  87.         UnPackTime(FHdr^.FileTime,dt2);  { Get the time of compressed file }
  88.         Case FHdr^.Method Of             { Get compression method }
  89.           0 : Method := 'Stored  ';
  90.           1 : Method := 'Most    ';
  91.           2 : Method := '2nd Most';
  92.           3 : Method := '2nd Fast';
  93.           4 : Method := 'Fastest ';
  94.         End;
  95.         Write( '   ',S,FHdr^.OrigSize:9,FHdr^.PackSize:10);
  96.         { Write Filesizes }
  97.         If ff > 1 then
  98.           { Don't get first Arj file in Arj file }
  99.           Write( (100-FHdr^.PackSize/FHdr^.OrigSize*100):9:0,'%',Method:15)
  100.            { Write ratios, method }
  101.           Else Write( Method:25);
  102.         Case dt2.month of               { Show date of compressed file }
  103.           1..9   : Write( '0':4,dt2.month);
  104.           10..12 : Write( dt2.month:4);
  105.     End;
  106.     Write( '/');
  107.     Case dt2.day of
  108.      1..9   : Write( '0',dt2.day);
  109.      10..31 : Write( dt2.day);
  110.     End;
  111.     Write( '/');
  112.     Case dt2.year of
  113.      1980 : Write( '80');
  114.      1981 : Write( '81');
  115.      1982 : Write( '82');
  116.      1983 : Write( '83');
  117.      1984 : Write( '84');
  118.      1985 : Write( '85');
  119.      1986 : Write( '86');
  120.      1987 : Write( '87');
  121.      1988 : Write( '88');
  122.      1989 : Write( '89');
  123.      1990 : Write( '90');
  124.      1991 : Write( '91');
  125.      1992 : Write( '92');
  126.      1993 : Write( '93');
  127.      1994 : Write( '94');
  128.      1995 : Write( '95');
  129.      1996 : Write( '96');
  130.     End;
  131.     Case dt2.hour of                          { Show time of compressed file }
  132.      0..9   : Write( '0':2,dt2.hour,':');
  133.      10..23 : Write( dt2.hour:3,':');
  134.     End;
  135.     Case dt2.min of
  136.      0..9   : Write( '0',dt2.min,':');
  137.      10..59 : Write( dt2.min,':');
  138.     End;
  139.     Case dt2.sec of
  140.      0..9   : Writeln( '0',dt2.sec);
  141.      10..59 : Writeln( dt2.sec);
  142.     End;
  143.         TotalU := TotalU + FHdr^.OrigSize; { Increase total uncompressed size }
  144.         TotalC := TotalC + FHdr^.PackSize; { Increase total compressed size }
  145.         Repeat
  146.           BlockRead(F,B,1);
  147.         Until b = 0;
  148.         BlockRead(F,FHdr^.FileCRC,4);      { Go past File CRC }
  149.         BlockRead(f,NR,2);
  150.         Sl := FilePos(F) + FHdr^.PackSize; { Where are we in file? }
  151.         End;
  152.         
  153.   Until (FHdr^.HdrSize = 0);  { No more files? }
  154.       GetFTime(F,x);
  155.         UnPackTime(x,dt1);
  156.     WriteLn( '   ============================================================================');
  157.     Write( (z-1):4,' Files  ',TotalU:12,TotalC:10,(100-TotalC/TotalU*100):9:0,
  158.             '%');
  159.     Case dt1.month of                  { Get date and time of Arj file }
  160.      1..9   : Write( '0':19,dt1.month);
  161.      10..12 : Write( dt1.month:20);
  162.     End;
  163.     Write( '/');
  164.     Case dt1.day of
  165.      1..9   : Write( '0',dt1.day);
  166.      10..31 : Write( dt1.day);
  167.     End;
  168.     Write( '/');
  169.     Case dt1.year of
  170.      1980 : Write( '80');
  171.      1981 : Write( '81');
  172.      1982 : Write( '82');
  173.      1983 : Write( '83');
  174.      1984 : Write( '84');
  175.      1985 : Write( '85');
  176.      1986 : Write( '86');
  177.      1987 : Write( '87');
  178.      1988 : Write( '88');
  179.      1989 : Write( '89');
  180.      1990 : Write( '90');
  181.      1991 : Write( '91');
  182.      1992 : Write( '92');
  183.      1993 : Write( '93');
  184.      1994 : Write( '94');
  185.      1995 : Write( '95');
  186.      1996 : Write( '96');
  187.     End;
  188.     Case dt1.hour of
  189.      0..9   : Write( '0':2,dt1.hour,':');
  190.      10..23 : Write( dt1.hour:3,':');
  191.     End;
  192.     Case dt1.min of
  193.      0..9   : Write( '0',dt1.min,':');
  194.      10..59 : Write( dt1.min,':');
  195.     End;
  196.     Case dt1.sec of
  197.      0..9   : Writeln( '0',dt1.sec);
  198.      10..59 : Writeln( dt1.sec);
  199.     End;
  200.   Close(f);
  201.   Dispose(FHdr);  { Done }
  202. End;
  203.  
  204. FUNCTION GAN(ARJfile:String): string;
  205.   Var
  206.     Dir  : DirStr;
  207.     Name : NameStr;
  208.     Exts : ExtStr;
  209.   Begin
  210.     FSplit(ARJFile,Dir,Name,Exts);
  211.     GAN := Name + Exts;
  212.   End;
  213.  
  214.  
  215. End.